using System;

using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Utilities;
using Org.BouncyCastle.X509.Store;

namespace Org.BouncyCastle.Cms
{
	/**
	* a basic index for a signer.
	*/
	public class SignerID
		: X509CertStoreSelector
	{
		public override int GetHashCode()
		{
			int code = Arrays.GetHashCode(this.SubjectKeyIdentifier);

			BigInteger serialNumber = this.SerialNumber;
			if (serialNumber != null)
			{
				code ^= serialNumber.GetHashCode();
			}

			X509Name issuer = this.Issuer;
			if (issuer != null)
			{
				code ^= issuer.GetHashCode();
			}

			return code;
		}

		public override bool Equals(
			object obj)
		{
			if (obj == this)
				return false;

			SignerID id = obj as SignerID;

			if (id == null)
				return false;

			return Arrays.AreEqual(SubjectKeyIdentifier, id.SubjectKeyIdentifier)
				&& Platform.Equals(SerialNumber, id.SerialNumber)
				&& IssuersMatch(Issuer, id.Issuer);
		}
	}
}
